package cn.rkylin.oms.order.service;

import cn.rkylin.oms.order.domain.OrderSku;
import cn.rkylin.oms.order.vo.*;
import cn.rkylin.oms.warehouse.shiporder.vo.ShiporderVO;
import com.github.pagehelper.PageInfo;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface IOrderService {
    /**
     * 根据条件取得数量
     *
     * @param params
     * @return
     * @throws Exception
     */
    public int selectCount(Map<String, Object> params) throws Exception;

    /**
     * 系统订单导出（商品信息）
     * @param orderVO
     * @return
     * @throws Exception
     */
    public List<OrderExportVO> exportSku(Map map) throws Exception;
    /**
     * 查询订单
     *
     * @param ecTradeVO
     * @throws Exception
     */
    public PageInfo<OrderVO> findByWhere(int page, int rows, OrderVO orderVO) throws Exception;

    public Map<String, Object> modifyOrderData(OrderInfoVO orderInfo, Map<String, String> map) throws Exception;

    public Map<String, Object> modifyOrderData(OrderInfoList orderInfoList, Map<String, String> map) throws Exception;

    public List<OrderSkuVO> getOrderSku(OrderSkuVO orderSkuVO) throws Exception;

    public List<OrderSkuVO> getOrderSku(String orderId) throws Exception;

    /**
     * 系统订单的各种count
     *
     * @param ecTradeVO
     * @throws Exception
     */
    public List<OrderVO> findCounts(OrderVO orderVO) throws Exception;

    public OrderVO getOrderInfoByTradeCode(String tradeCode) throws Exception;

    /**
     * 分派订单
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> assignOrder(AssignVO assigObject, String strPrjShortName) throws Exception;

    /**
     * 订单合并：
     * <p>
     * 合并的条件：当一条以上的订单为同网店、同客户ID、同收货人、同收货地址，系统判断这些订单如果网店的订单合并开关开启，订单状态为待审核未废弃，未合并过，未被锁定、
     * 自动状态、不存在售后单据、不存在未废弃的发票、未在待审核队列中，那么系统进行自动合并，合并时仅合并新下载到系统的订单与系统中已存在且未合并的多条订单。
     * 合并的处理如下：合并来源单号、买家留言、卖家备注和各种金额。
     * <p>
     * 合并后处理：更新子订单合并状态及合并后的GUID；删除合并前所有子订单中赠品；生成合并订单以及订单商品明细（主订单信息为拍单时间最早的订单为准，例拍单时间、付款
     * 时间等）
     *
     * @param orderIdList 系统订单id列表
     */
    public String mergeOrder(List<String> orderIdList);

    /**
     * 修改系统订单
     *
     * @param order 系统订单VO
     */
    public String updateOrder(OrderVO order);

    /**
     * 创建系统订单
     *
     * @param order 系统订单VO
     */
    public String createOrder(OrderVO order);

    /**
     * 检查订单问题 1.订单问题：如果订单存在以下情况会被拦截为订单问题单
     * 所属网店开启了自动合并订单，系统中存在可与之合并（同网店、同客户ID、同收货人、同收货地址）的已审核状态但不可操作的订单；
     * 有买家留言（网店开启了“有买家留言”拦截为订单问题）； 有卖家备注（网店开启了“有卖家备注”拦截为订单问题）；
     * 收货地址超长（网店开启了“收货地址超过N个字节拦截为订单问题）； 存在未废弃退款单； 系统状态和平台状态不一致（仅淘宝）
     * 合并订单的原订单数量大于15； 收货人、手机、电话信息有为空的； 身份证号为空（网店开启了“验证身份证号码“）；
     *
     * @param order 系统订单VO
     */
    public Map<String, Object> validateOrderProblems(OrderVO order);

    /**
     * 自动审核分派 根据设置进行审核分派：按网店设置订单下载多长时间以后才能进行自动审核这个参数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     */
    public String autoVerifyAndAssignOrder(Date startTime, Date endTime);

    /**
     * 订单自动分派的逻辑： 自动审核成功的订单如果商品明细全部为虚拟商品，订单状态变为待分派，且打成手动状态；
     * 如果商品明细中存在非虚拟商品，系统自动做以下操作： 1.自动创建发票（订单需要开发票，且不存在未废弃发票）；
     * 2.生成出库单：以订单发货仓库、收货人、收货地址、非虚拟商品明细、订购数量等信息生待发货状态的订单出库单。
     * <p>
     * 订单自动审核分派成功，状态变为发货中。
     *
     * @param orderId 系统订单id
     */
    public String autoAssignOrder(String orderId);

    /**
     * 生成系统订单
     *
     * @param ecTradeId 平台订单id
     */
    public String manualGenerateOrder(String ecTradeId);

    /**
     * 废弃系统订单
     * 选中一条或多条订单，操作废弃，如果可以废弃要提示“废弃订单系统将无法继续处理，将可能导致漏发，确认废弃吗？”，并且要输入废弃原因（文本）。废弃成功，订单变为已废
     * 弃状态。如果订单已不存在（被取消合并）、已归档、已废弃、自动处理、状态不是待审核的，不能被废弃。
     *
     * @param orderId
     * @param cancelRemark
     * @param strType      y:废弃，n:取消废弃
     * @return
     * @throws Exception
     */
    public Map<String, Object> abandonOrder(String orderId, String cancelRemark, String strType) throws Exception;

    /**
     * 查询系统订单（带分页）
     *
     * @param param 系统订单VO
     */
    public PageInfo<OrderVO> getOrdersPaged(OrderVO param);

    /**
     * 查询系统订单（无分页）
     *
     * @param param
     */
    public List<OrderVO> getOrders(OrderVO param);

    /**
     * 取消合并： 可以操作取消合并的订单要满足的条件有：已合并、未锁定的待审核且未废弃状态的订单；未建立售后事件、售后单据及有效发票；订单未全额退款。
     * 只能选择一条符合条件的订单操作取消合并，通过校验条件系统会将订单拆分恢复为合并前的多条订单，未通过校验的要有具体提示。所有订单记录日志。
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> cancelMerger(String orderId) throws Exception;

    /**
     * 手动审核分派
     *
     * @param orderId 系统订单id
     */
    public String manualVerifyAndAssignOrder(String orderId);

    /**
     * 审核订单
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> verifyOrder(String orderId, String qAuditOrder) throws Exception;

    /**
     * 取消审核
     *
     * @param orderId
     * @return
     * @throws Exception
     */
    public Map<String, Object> unAuditOrder(String orderId) throws Exception;

    /**
     * 完成订单，选择一条或多条订单，操作完成。只有已发货商品且未被锁定、未废弃的已审核的订单可以被完成，如果校验未通过要提示出完成**条订单，以下订单无法完成，提示出
     * 原因列表。 订单完成状态变为已完成。
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> finishOrder(String orderId) throws Exception;

    public Map<String, String> checkOffLockOrders(String orderId) throws Exception;

    /**
     * 锁定订单
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> lockOrders(String orderId) throws Exception;

    /**
     * 解锁订单
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> unlockOrders(String orderId) throws Exception;

    /**
     * 设置为自动订单
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> setOrderAutomatically(String orderId) throws Exception;

    /**
     * 设置为手动订单
     *
     * @param orderId 系统订单id
     */
    public Map<String, Object> setOrderManually(String orderId) throws Exception;

    /**
     * 恢复已删除订单商品
     * 修改待审核状态订单时，点击“恢复已删除商品”时，展示出之前已删除的该订单中商品明细（内容同订单明细），可以批量选择恢复至订单商品明细。
     *
     * @param orderId         系统订单id
     * @param orderItemIdList
     */
    public String withdrawDeletedOrders(String orderId, List<String> orderItemIdList);

    /**
     * 申请取消出库 在订单发货信息tab中选择一条出库单，点击申请取消，判断出库单状态对应以下处理： 1.
     * 未进行任何操作（未录入快递单号、未打印快递单、未打印发货单），系统直接取消出库单（状态变为已取消），关联订单如果无其他未取消出库单，订单状态回滚至待审核；
     * 2.
     * 出库单已操作或已系统发货或已平台发货，出库单标识申请取消，由库房操作是否同意取消；如果仓库反馈同意取消，系统取消该出库单（状态变为已取消），关联订单如果无其他未
     * 取消出库单，订单状态回滚至待审核； 3.订单出库单已发货，不能申请取消；
     *
     * @param orderId    系统订单id
     * @param outBoundId
     */
    public String askForStopOutBound(String orderId, String outBoundId);

    /**
     * 同意取消出库单，由仓库调用本接口 如果仓库反馈同意取消，系统取消该出库单（状态变为已取消），关联订单如果无其他未取消出库单，订单状态回滚至待审核；
     *
     * @param outBoundId
     */
    public String agreeStopOutBound(String outBoundId);

    /**
     * 批量修改物流公司
     *
     * @param orderIdList    订单id列表
     * @param logisticCompId 物流公司id
     */
    public int batchUpdateLogisticsCompany(String orderId, String lgstId, String lgstName, String lgstCode) throws Exception;

    /**
     * 批量修改发货仓库
     *
     * @param orderIdList 订单id列表
     * @param warehouseId 发货仓id
     */
    public int batchUpdateShipmentWarehouse(String orderId, String storId, String storName, String storCode) throws Exception;

    /**
     * 批量修改内部备注
     *
     * @param orderIdList
     * @param memo        内部备注
     */
    public String batchUpdateOrderMemo(String orderId, String memo) throws Exception;

    /**
     * 检测订单商品问题
     *
     * @param orderGoodsList
     */
    public Map<String, String> validateOrderGoodsProblems(List<OrderSku> orderGoodsList);

    /**
     * 手动强制合并订单（暂时不做）
     *
     * @param orderIdList 要合并的订单id列表
     */
    public Map<String, Object> forceMergeOrdersManual(List<String> orderIdList);

    /**
     * 验视订单
     * <p>
     * 更新has_inspected(已验视)状态
     *
     * @param orderId 系统订单id
     */
    public int inspectedOrder(String orderId, String value) throws Exception;

    public void update(OrderVO orderVO) throws Exception;

    public int updateOrderForConsign(OrderVO orderVO) throws Exception;

    /**
     * getOrderSkuByRefundId:根据系统退款单获取订单商品详情 <br/>
     *
     * @param refundId
     * @return
     * @throws Exception
     * @author zhanghao
     */
    public List<OrderSkuVO> getOrderSkuByRefundId(String refundId) throws Exception;

    public List<OrderSkuVO> getOrderSkuList(OrderSkuVO orderSkuVO) throws Exception;

    public int updateOrderSku(OrderSkuVO vo) throws Exception;

    public int GetUnallotQty(String entId, String skuId, String storId) throws Exception;

    public Map<String, String> downLoadOrder(DownLoadVO downLoadVO) throws Exception;

    /**
     * 退货单加载 订单商品以及订单关联补发单的商品
     *
     * @param orderId
     * @return
     * @throws Exception
     */
    public List<OrderSkuVO> getOrderSkuAndResendSkuByOrderId(String orderId) throws Exception;

    /**
     * 获取系统订单售后信息 wangxing add
     *
     * @param orderId
     * @return
     * @throws Exception
     */
    public List<OrderVO> getOrderAftersaleInfo(String orderId) throws Exception;

    /**
     * 发货单取消，相关订单信息修改
     *
     * @param shiporderVO
     * @return
     * @throws Exception
     */
    public Map<String, Object> cancelShiporder(ShiporderVO shiporderVO) throws Exception;

    /**
     * 校验待审核状态下的订单平台规格
     *
     * @param orderSkuVO
     * @return
     * @throws Exception
     */
    public List<OrderSkuVO> getOrderSkuWaitVerifyList(OrderSkuVO orderSkuVO) throws Exception;

    /**
     * 平台商品关联系统商品同时更新待审核订单商品的系统商品
     *
     * @param vo
     * @return
     * @throws Exception
     */
    public int updateOrderSkuForEcSku(OrderSkuVO vo) throws Exception;

    /**
     * 为创建售后事件查询订单
     *
     * @param page
     * @param length
     * @param param
     * @return
     */
    public PageInfo<OrderVOForEvent> findByWhere(int page, int length, OrderVOForEvent param) throws Exception;

    /**
     * 获取系统订单商品明细
     *
     * @param orderSkuId
     * @return
     * @throws Exception
     */
    public OrderSkuVO selectByPrimaryKeyOrderSku(String orderSkuId) throws Exception;

    /**
     * 批量修改平台备注
     *
     * @param orderId
     * @param salesRemark
     * @param tbFlagCode
     * @return
     * @throws Exception
     */
    public String batchUpdateOrderSalesRemark(String orderId, String salesRemark, Long tbFlagCode) throws Exception;
    
    public Map<String , Object> importCheck(Map<String,String> mapParm) throws Exception;

    /**
     * getOngoingOrdersBySkuCode:根据项目和goodsId获取进行中的订单. <br/>
     *
     * @author zhanghao
     * @param paramMap
     * @return
     */
    public int getOngoingOrdersBySkuCode(Map paramMap) throws Exception;
    
    /*
     * getAllOrderSku:根据订单ID获取所有订单商品. <br/>
     *
     * @author zhanghao
     * @param orderId
     * @return
     * @throws Exception
     */
    List<OrderSkuVO> getAllOrderSku(String orderId) throws Exception;

    /**
     * updateOrderSku4Replace:订单商品替换操作. <br/>
     *
     * @author zhanghao
     * @param orderSkuVO
     * @throws Exception
     */
    public void updateOrderSku4Replace(OrderSkuVO orderSkuVO) throws Exception;
}
